package 线程andJUC.线程同步;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class lock {
        /*
    Lock机制提供了比synchronized代码块和synchronized方法更为广泛的锁定操作，
    Lock在包含其代码块和方法功能的前提下，还更强大，更体现面向对象。
    Lock接口提供的方法：
    public void lock()             加同步锁
    public void unlock()           释放同步锁

     */

public static void main(String[] args) {
    MyTicketDemo3 mtd1=new MyTicketDemo3();
    MyTicketDemo3 mtd2=new MyTicketDemo3();

}
}
class MyTicketDemo3 implements Runnable {
    //      定义一个多线程共享的票源
    private int ticket=100;
    //    在成员位置创建一个ReentrantLock对象
    Lock lock=new ReentrantLock();
    //    设置线程任务：卖票
    @Override
    public void run() {
        while (true){
            if (ticket<100){
                try{
                    Thread.sleep(500);
//                    票存在，就卖票
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                    ticket--;
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                //ticket--;
                //System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                finally {
//                    3.在可能出现安全问题的代码后面调用Lock接口中的方法unlock释放锁
                    lock.unlock();//无论程序是否异常，都会把所释放
                }
            }
        }
    }
}
